package com.example.xss.client;

import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.http.HttpRequest;
import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.example.xss.commom.enums.MetricNameEnum;
import com.example.xss.lixinger.model.MetricDataReq;
import com.example.xss.lixinger.model.Stock;
import lombok.extern.slf4j.Slf4j;

import java.util.List;

@Slf4j
public class LixingerClient {

    /**
     * 当前登录cookie
     */
    public static String cookie = "";

    public static final String HOST = "https://www.lixinger.com/api";

    static {
        cookie = sign();
    }

    /**
     * 登录
     */
    public static String sign() {
        log.info("正在登录");
        String cookie = HttpRequest.post(HOST + "/account/sign-in/by-account")
                .contentType("application/json;charset=UTF-8")
                .body("{\"accountName\":\"1177\",\"password\":\"111777\"}")
                .execute().header("set-cookie");
        log.info("正在登录系统，得到cookie：{}", cookie);
        return cookie;
    }

    /**
     * 查询主要数据结果
     *
     * @param metricDataReq 请求参数
     * @return 查询结果
     */
    public static JSONObject getListData(MetricDataReq metricDataReq) {
        if (StrUtil.isBlank(cookie)) {
            log.info("检测到没有登录");
            cookie = sign();
        }
        log.info("getListData请求数据：{}", JSONUtil.toJsonStr(metricDataReq));
        String body = HttpRequest.post(HOST + "/company/fs-metrics/list-info")
                .contentType("application/json;charset=UTF-8")
                .cookie(cookie)
                .body(JSONUtil.toJsonStr(metricDataReq))
                .execute().body();
        log.info("getListData返回结果：{}", body);
        return JSONUtil.parseObj(body);
    }

    /**
     * 查询公司id
     *
     * @param key 公司名称
     * @return 查询结果
     */
    public static Stock searchOne(String key) {
        List<Stock> resList = search(key);
        if (CollUtil.isNotEmpty(resList)) {
            return resList.get(0);
        }
        return null;
    }
    /**
     * 查询公司id
     *
     * @param name 公司名称
     * @return 查询结果
     */
    public static List<Stock> search(String name) {
        if (StrUtil.isBlank(cookie)) {
            log.info("检测到没有登录");
            cookie = sign();
        }
        log.info("search请求数据：{}", name);
        JSONObject param = new JSONObject();
        param.set("keyword", name);
        String body = HttpRequest.post(HOST + "/search")
                .contentType("application/json;charset=UTF-8")
                .cookie(cookie)
                .body(JSONUtil.toJsonStr(param))
                .execute().body();
        log.info("search返回结果：{}", body);
        JSONArray objects = JSONUtil.parseArray(body);
        if (CollUtil.isEmpty(objects)) {
            log.info("没有查到结果，请更换 name :{}", name);
            return CollUtil.newArrayList();
        }
        return objects.toList(Stock.class);
    }

    /**
     * 逐级钻取获取到你想要的值
     *
     * @param metricNameEnum 枚举
     * @param <K>            你定义的返回的变量
     * @return 对应的值
     */
    public static <K> K drillValue(MetricNameEnum metricNameEnum, JSONObject from) {
        String value = metricNameEnum.getValue();
        String[] split = value.split("\\.");
        JSONObject processData = new JSONObject();
        for (int i = 0; i < split.length; i++) {
            if (i == 0) {
                // 第一层从 from拿
                processData = from.getJSONObject(split[i]);
                continue;
            }
            // 其他层从 process拿
            if (i == split.length - 1) {
                // 最后一层 直接返回
                JSONObject data = processData.getJSONObject(split[i]);
                if (ObjectUtil.isNull(data)) {
                    return null;
                }
                return Convert.convert(metricNameEnum.getClazz(), data.get("t"));
            } else {
                processData = processData.getJSONObject(split[i]);
            }

        }
        return null;
    }


}
